// @ts-check
const storageNamespace = 'vueAdmin-'

/**
 * 为了防止开发中有人勿将全局参数更改，需要冻结所有参数
 *
 * - 编码模式直接修改此处
 * - 全局配置应该在拷贝一份此配置使用，详见`src/main.js`
 *
 */
const CONFIG = {
  /**
   * 命名空间，用于标识
   * @type { string }
   * @memberof CONFIG
   */
  storageNamespace,
  /**
   * 全局 key 配置集合，如不需要可移除
   * @type { Record<string, any> }
   * @memberof CONFIG
   */
  key: {
    /**
     * 动态菜单 key
     * @type { string }
     * @memberof CONFIG.key
     */
    route: `${ storageNamespace }route`,
    /**
     * 个人登录 key
     * @type { string }
     * @memberof CONFIG.key
     */
    token: `${ storageNamespace }token`
  },
  /**
   * 全局 api 配置集合，如不需要可移除
   * @type { Record<string, any> }
   * @memberof CONFIG
   */
  api: {
    /**
     * 访问后台基础地址
     * @type { string }
     * @memberof CONFIG.api
     */
    baseURL: process.env.VUE_APP_BASE_API,
    /**
     * 访问超时时间
     * @type { number }
     * @memberof CONFIG.api
     */
    timeout: 1e4,
    /**
     * 访问的头部
     * @type { any }
     * @memberof CONFIG.api
     */
    header: null,
    /**
     * 是否无缓存
     * 在 Webkit 内核中，不存在自动缓存请求，
     * 但是在 IE 内核中，会自动缓存请求，所以针对此项
     * @type { boolean } [true: 移除缓存 | false: 浏览器自行决定]
     */
    noCache: true,
    /**
     * 展示加载动画
     * @type { boolean }
     * @memberof CONFIG.api
     */
    showLoading: false,
    /**
     * 加载的提示文本
     * @type { string | boolean }
     * @memberof CONFIG.api
     */
    loadingText: '加载中'
  },
  /**
   * 全局表格配置集合，如不需要可移除
   * @type { Record<string, any> }
   * @memberof CONFIG
   */
  table: {
    /**
     * 使用斑马线
     * @type { boolean }
     * @memberof CONFIG.table
     */
    useStripe: false,
    /**
     * 使用固定头部
     * @type { boolean }
     * @memberof CONFIG.table
     */
    useStickyHeader: false
  }
}
objectFreeze(CONFIG)

/**
 *  @readonly
 */
module.exports = CONFIG

function objectFreeze(/** @type { Record<string, any> } */ o) {
  Object.freeze(o) // 首先冻结第一层对象

  for (const k in o) {
    if (Object.prototype.hasOwnProperty.call(o, k)) {
      const _o = o[k]

      typeof _o === 'object' &&
      !Object.isFrozen(_o) &&
      objectFreeze(_o)
    }
  }
}
